#include "sound.h"
#include "anim.h"
#include "xpm.h"

/** Número máximo de quadros */
#define MAX_FRAMES 8

/** Descrição de uma animação */
struct AnimDesc {
	int nframe; 		/* Número de quadros */
	enum XPMID frames[8];	/* Quadros */
};

/** Array com todas as animações 
 * \warning Este array deve estar sincronizado com a enum AnimID
 */
static const struct AnimDesc animations[ANIM_COUNT] = {
	{1, {XPM_ALEX_L}}, // Alex parado olhando para a esquerda
	{1, {XPM_ALEX_R}}, // Alex parado olhando para a direita
	{4, {XPM_ALEX_WL1, XPM_ALEX_WL2, XPM_ALEX_WL3, XPM_ALEX_WL2}}, // Alex andando para a esquerda
	{4, {XPM_ALEX_WR1, XPM_ALEX_WR2, XPM_ALEX_WR3, XPM_ALEX_WR2}}, // Alex andando para a direita
	{1, {XPM_ALEX_JL}}, // Alex saltando para a esquerda
	{1, {XPM_ALEX_JR}},  // Alex saltando para a direita
	{2, {XPM_EAGLE_1L, XPM_EAGLE_2L}}, // Águia voando para a esquerda 
	{2, {XPM_EAGLE_1R, XPM_EAGLE_2R}},  // Águia voando para a direita 
	{2, {XPM_HELI_L1, XPM_HELI_L2}},   // Helicóptero voando para a esquerda
	{2, {XPM_HELI_R1, XPM_HELI_R2}},   // Helicóptero voando para a direita
	{2, {XPM_BOSS_1A, XPM_BOSS_1B}},   // Boss #1
	{2, {XPM_BOSS_2A, XPM_BOSS_2B}},   // Boss #2
	{2, {XPM_BOSS_3A, XPM_BOSS_3B}},   // Boss #3
	{3, {XPM_ROCK, XPM_PAPER, XPM_SCISSORS}}, // Jogo do galo 
};

/* Inicializa a animação */
void anim_init (Animation *anim, enum AnimID id, int msf)
{
	anim->id = id;
	anim->msf = msf;
	anim->msec = 0;
	anim->fnum = 0;
}

/* Inicia uma animação */
XPM anim_play (Animation *anim)
{
	anim->msec = MSECS;
	anim->fnum = 0;
	return xpm_get (animations[anim->id].frames[0]);
}

/* Avança uma animação */
XPM anim_continue (Animation *anim)
{
	if (anim->msec + anim->msf <= MSECS) { // Se terminou o tempo avança para o próximo quadro
		anim->msec = MSECS;
		anim->fnum ++; // Avança para o próximo quadro
		if (anim->fnum >= animations[anim->id].nframe) { // Se é o fim da animação... 
			anim->fnum = 0; //volta para o início
		} 
	}
	return xpm_get (animations[anim->id].frames[anim->fnum]);
}


